package com.company.netty.demo.NIO.bufferDemo;

import java.nio.IntBuffer;
/**
 * NIO: JDK新特性，非阻塞式；BIO：阻塞式
 * 包含三大核心组件：
 *  Channel（通道）
 *  Buffer（缓冲区）**
 *  Selector(选择器)
 *
 * NIO是面向缓冲区、或者面向块变成的；数据督导一个它稍后处理的缓冲区，需要时可在缓冲区中前后移动为止，增加了处理过程中的灵活性，
 * 使用它可以提供非阻塞式的高伸缩性网络；
 *
 *  Buffer类
 *  mark <= position <= limit <= capacity
 *  capacity:  容量，可以容纳最大的数据量，在缓冲区创建时被设定，并且不能修改
 *  limit： 标识缓冲区的当前终点，最大读、写位置标记，下面例子中，limit=5
 *  position: 位置，下一个要被读或写的元素的索引位置，每次读写缓冲区数据时都会改变，为下次读写做准备
 *  mark： 标记
 *
 *  buffer子类：
 *      intBuffer
 *      floatBuffer
 *      charBuffer
 *      LongBuffer
 *      doubleBuffer
 *      ByteBuffer  最常用 字节buffer
 *      shortBuffer
 *
 *
 *
 * Channel：NIO的通道类似流，但有区别
 *  1、通道可以同时进行读写，而流要么只能读或写
 *  2、通道可以实现异步读写数据
 *  3、通道可以从缓冲区读数据，也可以将数据写到缓冲区
 * 位置：java.nio.channels.Channel
 * 使用最多的子类：ServerSocketChannel、SocketChannel(父类：NetChannel、TCP协议)、
 * FileChannel、DatagramChannel(UDP协议的数据读写)
 *
 * */
public class BufferTest {

    public static void main(String[] args) {

        /**
         * 创建buffer，大小5，固定大小
         *
         * */
        IntBuffer intBuffer = IntBuffer.allocate(5);

        //写数据
//        intBuffer.put(10);
//        intBuffer.put(11);
//        intBuffer.put(12);
//        intBuffer.put(13);
//        intBuffer.put(14);
        //写数据
        for (int i = 0; i < intBuffer.capacity(); i++) {
            intBuffer.put(i*2);
        }

        //存放转读写需要切换，指针重置到0的位置
        intBuffer.flip();

        //读数据
        while (intBuffer.hasRemaining()) {
            //每get一次，指针往后移动一次
            System.out.println(intBuffer.get());
        }



    }

}
